package com.leyou.page.service;

import com.leyou.common.exception.pojo.ExceptionEnum;
import com.leyou.common.exception.pojo.LyException;
import com.leyou.item.client.ItemClient;
import com.leyou.item.dto.SpecGroupDTO;
import com.leyou.item.dto.SpuDTO;
import com.leyou.item.pojo.Brand;
import com.leyou.item.pojo.Category;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 商品详情
 */
@Service
public class PageService {
    //读取参数
    @Value("${ly.static.itemDir}")
    private String itemDir;
    @Value("${ly.static.itemTemplate}")
    private String itemTemplate;


    @Autowired
    private ItemClient itemClient;

    @Autowired
    private SpringTemplateEngine templateEngine;


    public Map<String,Object> getDetailData(Long id) {
        Map<String,Object> resultMap = new HashMap<>();

        //1.根据spuId查询SpuDTO
        SpuDTO spuDTO = itemClient.findSpuById(id);
        //2.根据品牌ID查询品牌对象
        Brand brand = itemClient.findBrandById(spuDTO.getBrandId());
        //3.根据分类ID集合查询所有分类
        List<Category> categories = itemClient.findCategoriesByIds(Arrays.asList(
                spuDTO.getCid1(),
                spuDTO.getCid2(),
                spuDTO.getCid3()));
        //4.根据分类ID查询所有规格组（包含组内参数）
        List<SpecGroupDTO> specGroups = itemClient.findSpecGroupAndParams(spuDTO.getCid3());

        resultMap.put("categories",categories);
        resultMap.put("brand",brand);
        resultMap.put("spuName",spuDTO.getName());
        resultMap.put("subTitle",spuDTO.getSubTitle());
        resultMap.put("detail",spuDTO.getSpuDetail());
        resultMap.put("skus",spuDTO.getSkus());
        resultMap.put("specs",specGroups);
        return resultMap;
    }

    /**
     * 用于为每个商品生成静态页面
     */
    public void createStaticPage(Long spuId){
        //1、创建Context对象：用于存储动态数据
        Context context = new Context();
        //设置动态数据
        context.setVariables(this.getDetailData(spuId));

        //2、读取模板文件（ok） 注意： 程序会自动Thymeleaf的前缀(templates)的目录查询该文件
        String tempName = itemTemplate + ".html";

        //3、使用模板引擎对象生成静态文件
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(new File(itemDir,spuId+".html"));
            /**
             * 参数一：模板文件名称
             * 参数二：设置Context对象
             * 参数三：指定输出流
             */
            templateEngine.process(tempName,context,writer);
        } catch (Exception e) {
            e.printStackTrace();
            throw new LyException(ExceptionEnum.FILE_WRITER_ERROR);
        }finally {
            //注意：必须关联输出流，否则后续无法删除该文件
            writer.close();
        }
    }

    public void deleteStaticPage(Long spuId) {
        //1.读取静态页文件
        String fileName = spuId+".html";

        File file = new File(itemDir,fileName);

        //2.删除文件
        if(file.exists()){
            file.delete();
        }
    }
}
